package com.party.pay;



import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class XunayHttpUtil {

    /**
     * 发送 JSON 格式的 POST 请求
     * @param url 请求 URL
     * @param request 请求对象（会被序列化为 JSON）
     * @param responseClass 响应类的 Class 对象，用于反序列化
     * @param <T> 响应类型
     * @return 反序列化后的响应对象
     * @throws IOException 网络相关异常
     */
    public static <T> T postJson(String url, Object request, Class<T> responseClass) throws IOException {
        // 将请求对象转为 JSON 字符串
        String jsonRequest = JSON.toJSONString(request);
        // 创建 URL 对象
        URL requestUrl = new URL(url);
        // 打开 HTTP 连接
        HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
        // 设置请求方法为 POST
        connection.setRequestMethod("POST");
        // 设置超时时间（单位：毫秒）
        connection.setConnectTimeout((int) TimeUnit.SECONDS.toMillis(10));
        connection.setReadTimeout((int) TimeUnit.SECONDS.toMillis(15));
        // 允许输出（因为要发送请求体）
        connection.setDoOutput(true);
        // 设置请求头，指定内容类型为 JSON
        connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");

        // 获取输出流，写入 JSON 请求体
        try (OutputStream outputStream = connection.getOutputStream()) {
            outputStream.write(jsonRequest.getBytes("UTF-8"));
            outputStream.flush();
        }

        // 读取响应
        int responseCode = connection.getResponseCode();
        if (responseCode != HttpURLConnection.HTTP_OK) {
            throw new IOException("HTTP 请求失败，响应码：" + responseCode);
        }

        // 读取响应内容并转为字符串
        StringBuilder responseBuilder = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                responseBuilder.append(line);
            }
        }

        // 关闭连接
        connection.disconnect();


        // 获取响应字符串
        String responseString = responseBuilder.toString().trim();

        // 检查响应是否为空或"false"
        if (responseString.isEmpty() || "false".equalsIgnoreCase(responseString)) {
            return null; // 返回null而不是尝试解析
        }

        // 将响应 JSON 字符串反序列化为指定类型的对象
        try {
            return JSON.parseObject(responseString, responseClass);
        } catch (JSONException e) {
            // 如果解析失败，抛出更详细的异常信息
            throw new IOException("JSON解析失败，响应内容：" + responseString, e);
        }
    }
}
